﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace Scommesse.Model
{
    [Serializable]
    public class Categoria : ICategoria
    {
        private readonly List<ICompetizione> _competizioni;

        public List<ICompetizione> Competizioni
        {
            get { return _competizioni; }
        }

        public String Nome { get; private set; }
        public Dictionary<Tipologia, Type> Tipologie { get; private set; }

        public Categoria(string nome, params Tipologia[] tipologie)
        {
            Nome = nome;
            _competizioni = new List<ICompetizione>();
            Tipologie = new Dictionary<Tipologia, Type>();
            
            foreach (Tipologia tipologia in tipologie)
            {
                switch (tipologia)
                {
                    case Tipologia.UXD:
                        Tipologie.Add(tipologia, typeof(Valori1X2));
                    break;
                    case Tipologia.UD:
                        Tipologie.Add(tipologia, typeof (Valori12));
                        break;
                    case Tipologia.UO:
                        Tipologie.Add(tipologia, typeof (ValoriUO));
                        break;
                    case Tipologia.GNG:
                        Tipologie.Add(tipologia, typeof (ValoriGNG));
                        break;
                }
            }
        }

        public ICompetizione AddCompetizione(string nome)
        {
            var competizione = new Competizione(nome, this);
            if (_competizioni.Contains(competizione))
                throw new Exception("la competizione esiste già");
            _competizioni.Add(competizione);
            return competizione;
        }

        public ICompetizione AddCompetizione(string nome, DateTime dataInizio, DateTime dataFine)
        {
            var competizione = new Competizione(nome, this, dataInizio, dataFine);
            if (_competizioni.Contains(competizione))
                throw new ArgumentException("la competizione esiste già");
            _competizioni.Add(competizione);
            return competizione;
        }

        public void RemoveCompetizione(string nome)
        {
            _competizioni.Remove(GetCompetizioneByName(nome));
        }

        public List<IEvento> GetAllEventi()
        {
            return Competizioni.SelectMany(comp => comp.Eventi).ToList();
        }

        public ICompetizione GetCompetizioneByName(String nome)
        {
            return Competizioni.FirstOrDefault(comp => (comp.Nome).Equals(nome));
        }

        public override bool Equals(object obj)
        {
            if (obj == null || GetType() != obj.GetType())
                return false;
            Categoria categoria = (Categoria)obj;
            return (Nome.ToLower().Equals(categoria.Nome.ToLower()));
        }

        public override int GetHashCode()
        {
            return GetType().GetHashCode();
        }
    }
}